home *** CD-ROM | disk | FTP | other *** search
- unit Eval;
- interface
-
- function ExpValue (ExpLine : string; var Error : boolean) : real;
-
- implementation
-
- function ExpValue (ExpLine : string; var Error : boolean) : real;
- var
- Index : integer;
- Ltr : char;
- NextLtr : char;
- Token : char;
- TokenValue : real;
-
- procedure GetLtr;
- begin {GetLtr}
- Ltr := NextLtr;
- if Index < length (ExpLine) then begin
- Index := succ (Index);
- NextLtr := ExpLine [Index];
- end else begin
- NextLtr := '%';
- end;
- end;
-
- procedure GetToken;
- procedure GetNum;
- var
- Str : string;
- E : integer;
- begin
- Str := '0'+Ltr; {Avoids problems if first char is '.'}
- while NextLtr in ['0'..'9'] do begin
- GetLtr;
- Str := Str + Ltr;
- end; {while}
- if NextLtr = '.' then begin
- GetLtr;
- Str := Str + Ltr;
- while NextLtr in ['0'..'9'] do begin
- GetLtr;
- Str := Str + Ltr;
- end; {while}
- Str := Str + '0'; {Avoids problems if last char is '.'}
- end;
- val (Str,TokenValue,E);
- Error := E <> 0;
- end;
-
- begin {GetToken}
- GetLtr;
- while Ltr = ' ' do GetLtr;
- if Ltr in ['0'..'9','.'] then begin
- GetNum;
- Token := '#';
- end else begin
- Token := Ltr;
- end;
- end;
-
- function Expression : real;
- var
- IExp : real;
-
- function Term : real;
- var
- ITerm : real;
- TFact : real;
-
- function Factor : real;
- var
- IFact : real;
-
- begin {Factor}
- case Token of
- '(' :
- begin
- GetToken;
- IFact := Expression;
- if Token <> ')' then Error := true;
- end;
- '#' :
- begin
- IFact := TokenValue;
- end;
- else
- Error := true;
- end;
- Factor := IFact;
- GetToken;
- end;
-
- begin {Term}
- if Token = '-' then begin
- GetToken;
- ITerm := -Factor;
- end else begin
- if Token = '+' then begin
- GetToken;
- end;
- ITerm := Factor;
- end;
- if not Error then begin
- while Token in ['*','/'] do begin
- case Token of
- '*' :
- begin
- GetToken;
- ITerm := ITerm * Factor;
- end;
- '/' :
- begin
- GetToken;
- TFact := Factor;
- if TFact <> 0 then begin
- ITerm := ITerm / TFact;
- end else begin
- Error := true;
- end;
- end;
- end; {case}
- end; {while}
- end; {if}
- Term := ITerm;
- end; {Term}
-
- begin {Expression}
- IExp := Term;
- if not Error then begin
- while Token in ['+','-'] do begin
- case Token of
- '+' :
- begin
- GetToken;
- IExp := IExp + Term;
- end;
- '-' :
- begin
- GetToken;
- IExp := IExp - Term;
- end;
- end; {case}
- end; {while}
- end; {if}
- Expression := IExp;
- end; {Expression}
-
- begin {ExpValue};
- Error := false;
- Index := 0;
- NextLtr := ' ';
- GetLtr;
- GetToken;
- if Token = '%' then begin
- ExpValue := 0.0;
- end else begin
- ExpValue := Expression;
- if Token <> '%' then Error := true;
- end;
- end;
-
- end.
-
- { -------------------------------- DEMO --------------------- }
-
- Program Evaluate;
- (* 10/1189 *)
- (* Uploaded by Pat Dant *)
- (* Based on the Pascal Unit Eval that allows you to take a string
- and perform a recurssive math function on the string resulting
- in a real answer.
- This Exe version allows the command line argument to be the string
- and will print the answer on the screen at the current cursor position.*)
-
- (* ExpValue unit is designed by Don McIver in his very well written program
- SCB Checkbook Program. Currently version 4.2.*)
-
- Uses Dos, Crt, Eval;
-
- const
- EvalStrPos = 1;
-
- var
- EvalString : string;
- Answer : real;
- EvalError : Boolean;
-
- begin
- ClrScr;
- Answer := 0;
- EvalError := False;
- Answer := ExpValue(ParamStr(EvalStrPos),EvalError );
- if EvalError then begin
- Writeln('Error in Command Line Format : ',Answer:8:2);
- Halt;
- end;
- Write(Answer:8:2);
- end.
-
-